import java.util.Deque;
import java.util.LinkedList;
import java.util.Locale;
import java.util.Scanner;

public class TestDay18 {

    public static void main1(String[] args) {
        Scanner scanner = new Scanner(System.in);
        double n = scanner.nextInt();
        double p = Math.sqrt(5);
        n = 1/p*(Math.pow((1+p)/2,n)-Math.pow((1-p)/2,n));
        System.out.println((int) n);
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String str1 = scanner.nextLine();
        String str2 = scanner.nextLine();
        str1 = str1.toLowerCase();
        str2 = str2.toLowerCase();
        //有通配符
        Deque<Character> s1 = new LinkedList<>();
        //没有通配符
        Deque<Character> s2 = new LinkedList<>();
        for (int i = 0; i < str1.length(); i++) {
            s1.push(str1.charAt(i));
        }
        for (int i = 0; i < str2.length(); i++) {
            s2.push(str2.charAt(i));
        }
        while (!s1.isEmpty() &&!s2.isEmpty()){
            //如果两个栈都不为空

                if (s1.peek().equals(s2.peek())){
                    //如果两个字符相同,那就一起弹出
                    s1.pop();
                    s2.pop();
                }else if(s1.peek() == '*'){
                    //看看符不符合条件
                    if(func(s2.peek())){
                        //s1不为空并且s1的栈顶是*
                        while (!s1.isEmpty() && s1.peek() == '*'){
                            s1.pop();
                        }
                        //如果为空的话,说明只有*了
                        if(s1.isEmpty()){
                            //此时判断p2是否有不合法的字符
                            //如果没有就一直弹出
                            while (!s2.isEmpty() && func(s2.peek())){
                                s2.pop();
                            }
                            //此时s1已经为空,后面判断s2是否为空
                            break;
                        }else if(s1.size() <= s2.size()) {
                           //如果我的s1栈顶是?并且我的s2长度和s1相等,那么就什么都不做
                            //?
                            //t
                            //这样可以保证,即使我的通配符不再有*也能在个数上完全匹配
                                //如果不符合上述条件
                                //abc?*
                                //abcttt
                                //这样的话,如果我的通配符没有*的话,那么如果不进行下面循环直接返回就会有一个问题
                                //该问题:长度不匹配
                                while (!s2.isEmpty() && s1.peek() != s2.peek()){
                                    //由于?永远也匹配不到,所以pop到长度一样,这样的话有无*无所谓
                                    if(s1.peek() == '?' && s1.size() == s2.size()){
                                        break;
                                    }
                                    s2.pop();
                                }
                        }
                   //写一个方法判断是否合法
                    }else {
                        //不符合条件
                        s1.pop();
                    }
                }else if(s1.peek() == '?'){
                    //只适用于一个通配符
                    if(func(s2.peek())){
                        s1.pop();
                        s2.pop();
                    }else {
                        //如果不匹配那就返回false
                        System.out.println(false);
                        return;
                    }
                }else {
                    //走到这里只有一个可能,这个符号是个非法符号
                    //还有一种可能就是,两个字符不匹配
                    System.out.println(false);
                    return;
                }
            }
        if(s1.isEmpty() && s2.isEmpty()){
            System.out.println(true);
        }else if(s2.isEmpty()){
            while (!s1.isEmpty() && s1.peek() == '*'){
                s1.pop();
            }
            System.out.println(s1.isEmpty());
        }else {
            System.out.println(false);
        }

    }
//t?t*1*.*
//txt12.xls
    //判断是否非法字符
    public static boolean func(char c){
        return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'z');
    }
    //te?t*.*
    //txt12.xls
}
